home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Franz PD
/
Franz PD Disk #240 (1993)(Rhein-Sieg-Soft).zip
/
Franz PD Disk #240 (1993)(Rhein-Sieg-Soft).adf
/
ELIZA.LST
< prev
next >
Wrap
File List
|
1993-06-02
|
57KB
|
1,724 lines
' **********************************
' * Eliza 1.20p 26.9.1991 *
' * (c) H. König, 2 Hamburg 53 *
' **********************************
RESERVE 170000
init ! Initialisieren
init.sprache
init.deutsch
menueein ! Menüs einschalten
info ! Startinfo
start:
programmkopf
anweisung(27)
ON MENU GOSUB menÜkontrolle
REPEAT
SLEEP
UNTIL ende!
CLOSEW #1
CLOSES 1
END ! system
PROCEDURE abfrage.ja
y$="J"
abfragen
RETURN
PROCEDURE abfrage.nein
y$="N"
abfragen
RETURN
PROCEDURE abfragen
anweisung(aw%)
anweisung(18)
CLR x%
mausk%=0
ay%=ay%(aw%)+5+LEN(aw$(aw%))
ay%=ay%*8-16 ! Rechtswert
ax%=ax%(aw%)*8-12 ! Hochwert
COLOR 2 ! schwarz
BOX ay%,ax%,ay%+64,ax%+14
COLOR 4 ! hellgrau
LINE ay%+1,ax%+1,ay%+63,ax%+1
LINE ay%,ax%+1,ay%,ax%+14
WHILE mausk%<>2 AND x%<>13
IF y$="J" THEN
COLOR 2
LOCATE ay%(aw%)+5+LEN(aw$(aw%)),ax%(aw%)
textstil(7,3,6) ! Invers
PRINT " J ";
textstil(0,1,0) ! Invers aus
PRINT " N ";
y$="J"
ELSE
LOCATE ay%(aw%)+5+LEN(aw$(aw%)),ax%(aw%)
textstil(0,1,0) ! Invers aus
PRINT " J ";
textstil(7,3,6) ! Invers
PRINT " N ";
y$="N"
ENDIF
taste
IF UPPER$(x$)="J" THEN
y$="J"
ELSE IF UPPER$(x$)="N"
y$="N"
ENDIF
IF mausy%=ax%(aw%) THEN ! Abfragefeld (Zeile) angeklickt?
IF mausx%-1>ay%(aw%)+3+LEN(aw$(aw%)) AND mausx%-1<ay%(aw%)+8+LEN(aw$(aw%)) THEN
y$="J"
ELSE IF mausx%-1>ay%(aw%)+7+LEN(aw$(aw%)) AND mausx%-1<ay%(aw%)+11+LEN(aw$(aw%))
y$="N"
ENDIF
ELSE
x1%=ASC(MID$(x$,2,1))-37
IF x1%=30 THEN ! Cursor rechts?
y$="N" ! ja, dann nein gewahlt
ELSE IF x1%=31 ! Cursor links?
y$="J" ! ja, dann ja gewahlt
ENDIF
ENDIF
WEND
textstil(0,1,0) ! Invers aus
programmfuss
RETURN
PROCEDURE anpassen1 ! Sonderzeichen der Sprachausgabe anpassen
x1$="ä" ! kleines ä
x2$="[" ! Ersatzwert
anpassen
x1$="Ä" ! großes Ä
x2$="[" ! Ersatzwert
anpassen
x1$="ö" ! kleines ö
x2$="\" ! Ersatzwert
anpassen
x1$="Ö" ! großes Ö
x2$="\" ! Ersatzwert
anpassen
x1$="ü" ! kleines ü
x2$="]" ! Ersatzwert
anpassen
x1$="Ü" ! großes Ü
x2$="]" ! Ersatzwert
anpassen
x1$="ß"
x2$="^" ! Ersatzwert
anpassen
x1$=" " ! Space
x2$="@" ! Ersatzwert
anpassen
RETURN
PROCEDURE anpassen ! Umlaute und ß anpassen
j1%=-1 ! Schleifeneingangswert
WHILE j1%<>0
j1%=j1%+1 ! Position im String
j1%=INSTR(j1%+1,t$,x1$) ! Zeichen suchen
IF j1%>0 THEN ! Zeichen gefunden?
MID$(t$,j1%,1)=x2$ ! ja, dann Zeichen austauschen
ENDIF
WEND
RETURN
PROCEDURE antwort.suchen ! noch nicht benutzten Text suchen
CLR ok% ! Flag löschen
beugen ! Worte beugen
IF ig%>0 AND frage%=1 THEN ! Text zur Beantwortung der Frage vorhanden
j1%=1+RAND(ig%)
i%=in%(j1%,1) ! ja, dann Recordnummer übergeben
satz.lesen ! Datensatz lesen
komp%=VAL(te$(3)) ! Kompositionsflag merken
ok%=1 ! Flag Datensatz gefunden
ELSE IF ig%>0 AND frage%=0 ! Text gefunden, war aber keine Frage
j1%=1+RAND(ig%)
i%=in%(j1%,1) ! ja, dann Recordnummer übergeben
satz.lesen ! Datensatz lesen
komp%=VAL(te$(3)) ! Kompositionsflag merken
ok%=1 ! Flag Datensatz gefunden
ENDIF
IF ok%=1 THEN ! Satz in der Datei gefunden
t$="" ! Rückgabestring löschen
IF komp%=0 THEN ! Antwort auf eine Frage nach gefundenem Schl.
t$=TRIM$(te$(2)) ! Antwort auf die Frage
ELSE IF komp%=1 ! Eingabe beugen und Satz anhängen
FOR j1%=1 TO w%
t$=t$+e1$(j1%)+" " ! umgebaute Eingabe zusammensetzen
NEXT j1%
t$=TRIM$(t$)+TRIM$(te$(2))! Antwort anhängen
ELSE IF komp%=2 ! Verlegenheitsfrage stellen
t$=TRIM$(te$(2)) ! Verlegenheitsfrage übergeben
ELSE IF komp%=3 ! Gegenfrage ohne die Antwort zu wiederholen
t$=TRIM$(te$(2))
ENDIF
z%(i%)=1 ! Schlüsselwort als benutzt kennzeichnen
ENDIF
RETURN
PROCEDURE anweisung(aw%)
PRINT AT(4,ax%(aw%));SPACE$(74) ! Zeile löschen
PRINT AT(ay%(aw%),ax%(aw%));aw$(aw%) ! Anweisung ausgeben
RETURN
PROCEDURE bearbeitungszeit
programmkopf
PRINT AT(4,28);"Importdauer: Festplatte ca. ";
PRINT n% DIV 70;" Sekunden, Diskette ca. ";
PRINT n% DIV 40;" Sekunden."
RETURN
PROCEDURE beenden ! Programm beenden
ALERT 0,"Wollen Sie aufhören",1,"Ende|Weiter",wahl%
ende!=(wahl%=1)
RETURN
PROCEDURE beugen ! Worte der Eingabe beugen
CLR x%
CLR x1%
FOR j%=1 TO w%
IF UPPER$(e1$(j%))="UND" OR UPPER$(e1$(j%))="ODER" THEN
INC x%
ELSE IF UPPER$(e1$(1))="DU"
x1%=1
ELSE IF UPPER$(e1$(1))="IHR"
x1%=2
ENDIF
NEXT j%
IF x1%>0 AND NOT x% THEN
RESTORE beugungen
x$="" ! Eingangswert für die Schleife
CLR x%
WHILE x$<>"ende" AND x%=0
READ x$,y$
IF UPPER$(e1$(2))=UPPER$(x$) THEN
e1$(2)=y$ ! Beugung übernehmen
x%=1 ! Schleife abbrechen
ENDIF
WEND
IF x$="ende" THEN ! keine Beugung gefunden
e1$(2)=e1$(2)+"st" ! 'st' anhängen
ENDIF
ENDIF
RETURN
PROCEDURE blaettern
IF tx%>1 THEN ! mindestens 2 Datensatze vorhanden?
IF i%<1 THEN ! Datensatzposition kleiner 1
i%=tx% ! ja, Datensatzposition = letzter Datensatz
ELSE IF i%>tx% ! Position grosser letzten datensatz?
i%=1 ! Datensatzposition = 1. Datensatz
ENDIF
satz.lesen
daten.zeigen
ENDIF
RETURN
PROCEDURE check.datei ! Datei schon ausgewählt?
CLR abbruch% ! Flag löschen
IF dimflag%=0 THEN ! Datei schon ausgewählt
index.ein ! nein, dann Datei auswählen
ENDIF
IF dimflag%=0 AND abbruch%=1 THEN ! Auswahl abgebrochen
RESUME start ! neu starten
ENDIF
RETURN
PROCEDURE cursor.aus
LOCATE spalte%+sp%,zeile% ! Cursor positionieren
textstil(0,1,0) ! Invers ausschalten
PRINT MID$(t$,sp%,1) ! Zeichen ausgeben
RETURN
PROCEDURE daten.aendern ! Datensatz in der Maske ändern
daten.zeigen ! Datensatz anzeigen
anweisung(14)
daten.eingeben1 ! Datensatz über Maske eingeben/ändern
satz.schreiben ! Datensatz schreiben
CLR x%
um%=2
RETURN
PROCEDURE daten.bereitst ! Daten der Hauptdatei einlesen
check.datei ! Datei schon ausgewählt
CLR tx%
y$="J"
bearbeitungszeit
anweisung(16) ! Unterbrechung
oeffne.r
CLR abbruch% ! Abbruchflag löschen
CLR rn%
WHILE rn%<n% AND abbruch%=0
INC rn%
unterbrechung ! auf Unterbrechung prüfen
IF tx%>=mg% THEN
IF pwd%=0 THEN
passwort
IF pwd%=0 THEN
rn%=n%
ENDIF
ELSE
anweisung(28) ! Speicher ist voll
tastendruck
rn%=n%
ENDIF
ENDIF
GET #1,rn% ! Datensatz lesen
vergleich
IF vflag%=1 THEN ! in Indexdatei übernehmen
INC tx% ! Indexzähler +1
rc%(tx%)=rn% ! Recordnummer merken
a$(tx%)=MID$(record$,po%(id%(0)),il%)
PRINT AT(73,2);tx%
ENDIF
WEND
CLOSE
CLR sortflag% ! Flag für unsortierte Datei setzen
sortieren
RETURN
PROCEDURE daten.eingeben ! Dateneingabe über Maske
PRINT AT(4,31);SPACE$(74) ! Zeile löschen
PRINT AT(4,31);"Nur mit Shareversion oder 'Datei' möglich"
tastendruck ! auf Tastendruck warten
anweisung(17) ! Anweisung zur Steuerung ausgeben
RETURN
PROCEDURE daten.eingeben1 ! einen Datensatz über Maskeneingabe
j%=1 ! Feldzähler =1
REPEAT ! Schleife ausführen
sp%=1 ! Spalte =1
daten.eingeben1.1:
IF j%>be% THEN ! Feldzähler > letztes Feld
j%=1 ! ja, dann Feldzähler =1
ELSE IF j%<1 ! Feldzähler < 1
j%=be% ! ja, dann Feldzähler = letztes Feld
ENDIF
eingabe(sp%,sz%+mx%(j%),my%(j%),td%(j%),te$(j%)) ! Eingabe holen
IF mnr%=1 THEN ! Routine wurde von Datenpflege aufgerufen
prÜfe.vorgabe.input(j%,tx$) ! Datenfeld nach Input-Flag anpassen
ENDIF
SWAP te$(j%),tx$ ! Eingabe an Feld zurückgeben
daten.zeigen1 ! Datenfeld in der Maske ausgeben
IF mausy%>=sz% AND mausy%<28 AND mausk%=1 THEN ! Maussteuerung?
CLR x% ! ja, Tastatursteuerung zurücksetzen
zzaehler%=mausy%-sz% ! Zeilenzähler = Mausposition
FOR j1%=1 TO be% ! Datenfeld ermitteln
IF zzaehler%=mx%(j1%) THEN ! Mausspalte im Datenfeld?
j%=j1% ! ja, Datenfeldnummer setzen
j1%=be%+1 ! Schleife abbrechen
ENDIF
NEXT j1%
IF mausx%>=my%(j%) AND mausx%<=my%(j%)+td%(j%) THEN
sp%=mausx% ! Eingabespalte setzen
ENDIF
GOTO daten.eingeben1.1
ENDIF
IF x%=65 THEN ! Cursor hoch
DEC j%
ELSE IF x%=66 OR x%=13 ! Cursor runter
INC j%
ENDIF
UNTIL x%=13 AND j%=be%+1 OR x%=27 ! Schleifenabbruch
um%=be% ! Menü auf Ende schalten
RETURN
PROCEDURE daten.loeschen ! Datensatz löschen
programmfuss
aw%=2
abfrage.ja
IF y$="J" THEN
rn%=rc%(i%) ! Zeiger auf Record merken
FOR j%=1 TO be% ! Datensatz löschen
te$(j%)=SPACE$(td%(j%))
NEXT j%
satz.schreiben ! Datensatz schreiben
DELETE a$(i%) ! Indexeintrag löschen
DELETE rc%(i%) ! Zeiger auf Datensatz löschen
INSERT rc%(1)=rn% ! Zeiger auf Datensatz einfügen
INSERT a$(1)=te$(id%(0))
sortflag%=1 ! Flag für sortierte Datei setzen
ENDIF
um%=9 ! auf Tabelle schalten
x%=13 ! RETURN für Bestätigung
RETURN
PROCEDURE daten.pflege ! tabellarische Datenpflege
RETURN
PROCEDURE daten.suchen ! Datensatz über Index suchen
sortieren ! Datei eventuell sortieren
maske.einblenden
PRINT AT(4,31);"Suchbegriff eingeben. Zeichen hinterm '*' werden ignoriert. Esc = Abbruch."
su$=LEFT$(su$+SPACE$(td%(id%(0))),td%(id%(0)))
eingabe(1,sz%+mx%(id%(0)),my%(id%(0)),il%,su$)
v%=INSTR(tx$,"*")
IF x%<>27
IF v%>1 THEN
su$=LEFT$(tx$,v%-1)
ELSE
su$=tx$ ! Suchstring
ENDIF
ls%=LEN(su$) ! Länge des Suchstrings
suchen ! Such-Routine
IF in%=0 THEN ! Eintrag nicht gefunden
PRINT AT(4,31);SPACE$(74)
PCOLOR 6,0
PRINT AT(4,31);"Eintrag nicht gefunden.";
PCOLOR 1,0
PRINT " Menüpunkt mit Maus auswählen und bestätigen."
taste
ELSE
WHILE LEFT$(a$(in%-1),ls%)=su$
DEC in% ! rückwärts suchen
WEND
i%=in% ! Zeiger auf Datensatz
IF tx%>ez% THEN ! mehr als 21 Datensätze vorhanden?
um%=9 ! ja, dann auf Tabelle schalten
ELSE
um%=3 ! nein, dann auf ändern schalten
satz.lesen ! Datensatz lesen
daten.zeigen ! Datensatz anzeigen
menÜausgeben ! Datenpflegemenü aktualisieren
x%=13
ENDIF
ENDIF
ENDIF
RETURN
PROCEDURE daten.zeigen ! Datensatz in Maske ausgeben
PRINT AT(2,2);SPACE$(76)
PRINT AT(2,2);"Interner Eintrag: ";i%
PRINT AT(27,2);"Record in der Datei: ";rn%
PRINT AT(55,2);"Letzter Eintrag: ";n%
maske.einblenden
FOR j%=1 TO be%
daten.zeigen1
NEXT j%
RETURN
PROCEDURE daten.zeigen1 ! Datenfeld in Maske ausgeben
IF j%=id%(0) THEN
PCOLOR 6,0 ! Indexfeld farbig darstellen
PRINT AT(my%(j%)-1-LEN(td$(j%)),sz%+mx%(j%));td$(j%)
PCOLOR 1,0 ! wieder normale Farbe einschalten
ENDIF
PRINT AT(my%(j%)+1,sz%+mx%(j%));te$(j%)
RETURN
PROCEDURE daten.zeigen2 ! 20 Datensätze auf Bildschirm
programmkopf
PCOLOR 6,0
LOCATE 1,sz%
FOR j1%=lgr% TO rgr% ! Datenfeldnamen anzeigen
PRINT dr$(j1%);SPC(td%(j1%)-LEN(dr$(j1%))+1);
NEXT j1%
PCOLOR 1,0
CLR zzaehler% ! Zeilenzähler zurcksetzen
FOR i%=i% TO i%+ez%-1 ! 20 Datensätze ab Indexzähler ausgeben
satz.lesen ! Datensatz lesen
INC zzaehler%
LOCATE 1,sz%+zzaehler%
FOR j1%=lgr% TO rgr% ! Datensatz anzeigen
PRINT te$(j1%);" ";
NEXT j1%
NEXT i%
zzaehler%=1
SUB i%,ez% ! minus Anzahl der Maskenzeilen
RETURN
PROCEDURE daten.zeigen3 ! 20 Datensätze links/rechts verschieben
j%=1
in%=i% ! Zeiger auf aktuellem Datensatz merken
i%=ii% ! 1. Datensatz auf dem Bildschirm
zz%=zzaehler% ! Zeilenzähler merken
position ! Feldposition berechnen
daten.zeigen2 ! 20 Datensätze ausgeben
ii%=i% ! Bildschirmzeile für Mausteuerung zurückholen
i%=in% ! Datensatzzeiger zurückholen
zzaehler%=zz% ! aktuelle Bildschirmzeile zurückholen
RETURN
PROCEDURE datenpflege ! Datenpflege-Menü
IF dimflag%=0 THEN ! Datei schon ausgewählt
daten.bereitst
ENDIF
vf.flag%=1 !
cf%=1 ! Cursor- und Maussteuerung erlaubt
oeffne.r ! Datenbank oeffnen
programmkopf
datenpflege.start:
CLR mausk%
sortieren
aw%=18 ! Anweisung Nr. 18
menÜkontrolle1
datenpflege.start1:
CLR mausk%
SELECT um%
CASE 1
daten.eingeben
CASE 2
CLR vf.flag% ! Vorgabeflag zurücksetzen
daten.suchen
vf.flag%=1 ! Vorgabeflag setzen
CASE 3
daten.aendern
CASE 4
daten.loeschen
CASE 5
i%=1 ! Zeiger auf 1. Datensatz
blaettern
CASE 6
DEC i%
blaettern
CASE 7
INC i%
blaettern
CASE 8
i%=tx% ! Zeiger auf letzten Datensatz
blaettern
CASE 9 ! tabellarische Datenpflege
CASE 10
GOTO datenpflege.ende
ENDSELECT
GOTO datenpflege.start
datenpflege.ende:
sortieren ! prüfen ob Datei sortiert werden muß
CLR cf% ! Cursorsteuerung abschalten
CLR vf.flag% ! Vorgabeprüfung abschalten
CLOSE
RETURN
PROCEDURE deutsch(text1$) ! deutsche Sprachausgabe
IF dial% THEN ! Dialogaufzeichnis ist eingeschaltet
PRINT #2,text1$;" ";TRIM$(te$(1));" ";te$(3) ! Eingabe in Datei schreiben
PRINT #2,STRING$(79,"-") !
ENDIF
mw%=80
mm%=mw%/2
lg1%=LEN(text1$) ! Länge des Anweisungstextes
pp%=(mw%-lg1%)\2
a1$=text1$
textstil(2,1,0)
PRINT AT(4,10);SPACE$(75)
PRINT AT(4,11);SPACE$(75)
IF lg1%>70 THEN ! Textlänge mehr als 70 Zeichen?
v%=RINSTR(70,a1$," ") ! ja, dann Leerzeichen suchen
IF v% THEN
PRINT AT(4,10);LEFT$(a1$,v%) ! Text für 2 Zeilen splitten
PRINT AT(4,11);MID$(a1$,v%+1)
ENDIF
ELSE
PRINT AT(4,10);a1$
ENDIF
IF sprache% THEN ! Sprachausgabe eingeschaltet?
text$="" ! alten Phonemtext löschen
t$=" "+UPPER$(text1$)+" " ! Text in Großbuchstaben wandeln
FOR i4%=1 TO LEN(t$)
aa=ASC(MID$(t$,i4%,1))
IF aa>=44 AND aa<=57 THEN ! Betonungszeichen übernehmen
text$=text$+MID$(t$,i4%,1)
ELSE
aa=aa-abz%
IF aa=-32 OR aa>90-abz% THEN
anpassen1 ! Umlaute anpassen
aa=ASC(MID$(t$,i4%,1))-abz%
ENDIF
IF aa>=0 AND aa<=abz% THEN
IF n5%(aa) THEN ! Anzahl der Phoneme für ein Zeichen
FOR j4%=1 TO n5%(aa)
IF MID$(t$,i4%,LEN(te1$(aa,j4%)))=te1$(aa,j4%) THEN
text$=text$+ph$(aa,j4%)
i4%=i4%+LEN(te1$(aa,j4%))-1
j4%=n5%(aa)
ENDIF
NEXT j4%
ENDIF
ENDIF
ENDIF
NEXT i4%
SAY text$,akt1%() ! Text sprechen
ENDIF
RETURN
PROCEDURE dialog ! Dialog mit dem Amiga
daten.bereitst
programmfuss
IF dial% THEN
x$=TIME$
v%=RINSTR(x$,":")
IF v% THEN
x$=MID$(x$,v%+1)
ENDIF
x$=DATE$+"."+x$
OPEN "O",#2,pfad$(0)+dateiname$+" "+x$
ENDIF
deutsch("Hallo, ich heiße Amiga, und Du?")
lg%=15
t$=SPACE$(lg%)
eingabe(1,31,4,lg%,t$)
sp$=TRIM$(tx$) ! Spielernamen merken
IF sp$="" THEN
sp$="Partner"
ENDIF
oeffne.r ! Wortschatzdatei öffnen
CLR abbruch% ! Abbruchflag loeschen
lg%=70 ! Länge der Eingabe
t$="Hallo, "+sp$+" erzähle mir etwas von Dir und Deiner Familie."
WHILE abbruch%=0
programmfuss
anweisung(7)
deutsch(t$)
t$=SPACE$(lg%)
eingabe(1,18,4,lg%,t$)
e$=TRIM$(tx$)
IF dial% THEN ! Dialogaufzeichnis ist eingeschaltet
PRINT #2,e$ ! Eingabe in Datei schreiben
ENDIF
IF UPPER$(e$)<>"QUIT" THEN
zeile.zerlegen ! Eingabe des Gesprächpartner zerlegen
IF w%>1 THEN ! mehr als 2 Worte eingegeben?
ig%=0 ! Anzahl der Schlüsselworte löschen
CLR ii%
WHILE ii%<w%
INC ii%
su$=UPPER$(e$(ii%)) ! Suchwort
suchen1 ! Wort suchen
IF in% THEN ! Wort gefunden
WHILE UPPER$(TRIM$(a$(in%-1)))=su$ ! Bereichsanfang rückwärts suchen
DEC in% ! Zähler -1
WEND
WHILE UPPER$(TRIM$(a$(in%)))=su$ ! vorwärts suchen
IF z%(in%)=0 THEN ! Schlüsselwort noch nicht benutzt
INC ig% ! Zähler erhöhen
in%(ig%,0)=ii% ! Wortnummer merken
in%(ig%,1)=in% ! Recordnummer merken
ENDIF
INC in%
WEND
ENDIF
WEND
IF ig%=0 AND frage%=1 THEN
verlegenheitsfrage ! Verlegenheitsfrage suchen
antwort.suchen ! noch nicht benutzten Text suchen
IF ok%=0 THEN ! keine Verlegenheitsfrage mehr vorhanden
t$="Nun muß ich aber Schluß machen. Tschüss."
deutsch(t$)
abbruch%=1 ! Programm abbrechen
ENDIF
ELSE ! Dialog ohne Fragestellung
antwort.suchen ! Antwort oder Textkomposition suchen
IF ok%=0 THEN ! nichts gefunden, dann
textkomposition ! Text umbauen
IF ok%=0 THEN ! nicht möglich, dann
verlegenheitsfrage ! Verlegenheitsfrage suchen
antwort.suchen ! noch nicht benutzten Text suchen
IF ok%=0 THEN ! keine Verlegenheitsfrage mehr gefunden
t$="Nun muß ich aber Schluß machen. Tschüss."
deutsch(t$)
abbruch%=1 ! Programm abbrechen
ENDIF
ENDIF
ENDIF
ENDIF
ELSE IF w%<2 ! weniger als 2 Worte eingeben
t$="Mach gefälligst einen anständigen Satz."
ENDIF
ELSE
CLOSE ! alle Dateien schließen
abbruch%=1 ! Abbruchflag bei 'QUIT' setzen
ERASE z%() ! Feld mit den Flags löschen
DIM z%(mg1%+10) !
ENDIF
WEND
CLOSE ! alle Dateien schließen
RETURN
PROCEDURE druckfeldname ! Feldnamen für Liste drucken
FOR jj%=1 TO mz%
FOR j%=1 TO be%
IF pt%(j%)>0 THEN ! Datenfeld ausgeben
PRINT #2,dr$(pt%(j%));SPC(td%(pt%(j%))-LEN(dr$(pt%(j%)))+1);
ENDIF
NEXT j%
NEXT jj%
RETURN
PROCEDURE eingabe(sp%,zeile%,spalte%,lg%,t$)
undo1$=t$ ! Eingabe sichern
eingabe0:
PRINT AT(spalte%+1,zeile%);t$ ! String auf Bildschirm
eingabe1:
IF sp%<1 THEN ! Spalte < 1
sp%=1 ! ja, dann Spalte = 1
ELSE IF sp%>lg% ! Spalte > Stringlaenge
sp%=lg% ! ja, dann Spalte = Stringlaenge
ENDIF
LOCATE spalte%+sp%,zeile% ! Cursor positionieren
textstil(7,3,6) ! Invers an
PRINT MID$(t$,sp%,1) ! Zeichen ausgeben
textstil(0,1,0) ! Invers aus
taste ! Zeichen von Tastatur holen
IF mausy%>0 THEN ! mit Maus positioniert
cursor.aus ! Ersatz-Cursor aus
IF (cf% AND mausy%<>zeile%) OR (cf% AND mausx%<spalte%) OR (cf% AND mausx%>spalte%+lg%) THEN
GOTO eingabe.ende ! ja, dann Ende
ELSE
sp%=mausx%-spalte% ! Spaltenposition = Mausspalte-Spalte
ENDIF
ENDIF
IF cf%=1 THEN ! Datenfeld links/rechts
IF x%=12 OR x%=18 OR x%=20 OR x%=22 THEN !
GOTO eingabe.ende
ENDIF
ENDIF
IF x%=13 OR x%=27 THEN ! Abbbruch durch Esc oder RETURN?
GOTO eingabe.ende
ELSE IF x%=155 ! Sondertasten
x%=ASC(MID$(x$,2,1)) ! ASCII-Wert
cursor.aus ! Ersatz-Cursor ausschalten
IF x%=65 AND cf%=1 OR x%=66 AND cf%=1 THEN ! Abbbruch
GOTO eingabe.ende
ENDIF
IF x%=63 THEN ! HELP-Taste
ELSE IF x%=67 ! Cursor rechts
INC sp% ! ja, dann Spalte +1
ELSE IF x%=68 ! Cursor links
DEC sp% ! ja, dann Spalte -1
ELSE IF x%=90 ! TAB links
sp%=sp%-8 ! Spalte -8
ENDIF
ELSE IF x%=127 ! Delete
t$=LEFT$(t$,sp%-1)+MID$(t$,sp%+1,lg%-sp%)+" " ! Zeichen löschen
ELSE IF x%<32 OR x%>127 AND x%<160 ! Steuerzeichen?
cursor.aus
IF x%=8 AND sp%>1 THEN ! Backspace
t$=LEFT$(t$,sp%-2)+MID$(t$,sp%,lg%-sp%+1)+" " ! Leerzeichen einfügen
sp%=sp%-1 ! Spalte -1
ELSE IF x%=4 ! Ctrl-d
t$=SPACE$(lg%) ! ja, dann String löschen
ELSE IF x%=9 ! TAB rechts
sp%=sp%+8 ! ja, dann Spalte +8
ELSE IF x%=16 ! Crtl-p
auto.insert%=NOT auto.insert% ! ja, dann Insertflag ändern
CLR x% ! Steuerzeichen löschen
IF auto.insert%=0 THEN
PRINT AT(2,29);"Insert aus"
ELSE
PRINT AT(2,29);"Insert an "
ENDIF
ELSE IF x%=21 ! Ctrl-u = Feld einfügen
t$=LEFT$(undo$+SPACE$(lg%),lg%) ! Text aus Puffer auf Sollänge bringen
ELSE IF x%=25 ! Ctrl-y = Feld löschen
undo$=t$ ! Text zwischenspeichern
t$=SPACE$(lg%) ! String löschen
sp%=1 ! Spalte = 1
ENDIF
ELSE ! gültiges ASCII-Zeichen übernehmen
IF auto.insert% THEN ! Einfügemodus eingeschaltet?
t$=LEFT$(t$,sp%-1)+x$+MID$(t$,sp%,lg%-sp%) ! ja, dann Zeichen einfügen
ELSE ! Überschreibmodus
MID$(t$,sp%,1)=x$ ! Zeichen überschreiben
ENDIF
INC sp% ! Spalte +1
ENDIF
GOTO eingabe0
eingabe.ende:
cursor.aus ! Ersatz-Cursor ausschalten
tx$=t$ ! Rückgabestring an die aufrufende Procedure
sp1%=sp%
RETURN
PROCEDURE einsortieren ! Datensatz einsortieren
ls%=il% ! Vergleichslänge = Indexlänge
su$=a$(i%) ! Suchstring übergeben
rc%(0)=rc%(i%) ! Datensatzzeiger merken
DELETE a$(i%) ! Eintrag löschen
DELETE rc%(i%) ! Eintrag löschen
DEC tx% ! interner Zähler -1 (für Suchroutine)
suchen ! Eintrag suchen
INC tx% ! internen Zähler korrigieren
IF in%=0 THEN ! kein Eintrag gefunden?
IF su$>a$(i3%) THEN ! Vergleichsstring > Eintrag
INSERT a$(i3%+1)=su$ ! ja, dann dahinter einfügen
INSERT rc%(i3%+1)=rc%(0) ! Recordnummer einfuegen
ELSE
INSERT a$(i3%)=su$ ! nein, dann davor einfügen
INSERT rc%(i3%)=rc%(0) ! Recordnummer einfuegen
ENDIF
ELSE
INSERT a$(in%)=su$ ! beim gefundenen Eintrag einfügen
INSERT rc%(in%)=rc%(0) ! Recordnummer einfuegen
ENDIF
sortflag%=1 ! Flag für sortierte Datei
RETURN
PROCEDURE erste.person.ersetzen ! 1. Person durch 2. Person ersetzen
FOR j%=1 TO w% ! Anzahl der Worte der Eingabezeile
e1$(j%)=e$(j%) ! Wort merken
IF UPPER$(e$(j%))="ICH" THEN
e1$(j%)="Du"
ELSE IF UPPER$(e$(j%))="DU"
e1$(j%)="ich"
ELSE IF UPPER$(e$(j%))="MICH"
e1$(j%)="Dich"
ELSE IF UPPER$(e$(j%))="DICH"
e1$(j%)="mich"
ELSE IF UPPER$(e$(j%))="MEIN"
e1$(j%)="Dein"
ELSE IF UPPER$(e$(j%))="MEINE"
e1$(j%)="Deine"
ELSE IF UPPER$(e$(j%))="MEINER"
e1$(j%)="Deiner"
ELSE IF UPPER$(e$(j%))="DEIN"
e1$(j%)="mein"
ELSE IF UPPER$(e$(j%))="DEINE"
e1$(j%)="meine"
ELSE IF UPPER$(e$(j%))="MIR"
e1$(j%)="Dir"
ELSE IF UPPER$(e$(j%))="DIR"
e1$(j%)="mir"
ELSE IF UPPER$(e$(j%))="WIR"
e1$(j%)="ihr"
ENDIF
NEXT j%
RETURN
PROCEDURE fehler
IF ERR=8 THEN
fehler.anzeigen("Speichermangel. Unnötige Programme beenden.")
ELSE IF ERR=-51 ! Datei kann nicht geöffnet werden
CLOSE
fehler.anzeigen("Keine Maske und/oder Datei für dieses Programm.")
RESUME start
ENDIF
fehler.anzeigen(" gemäß Handbuch: ")
RESUME start
RETURN
PROCEDURE fehler.anzeigen(f$)
programmfuss
PCOLOR 3,0
PRINT AT(4,31);"Fehler-Nr.: ";
PCOLOR 1,0
PRINT ERR;" ";
PCOLOR 3,0
PRINT f$
PCOLOR 1,0
CLOSE
GOSUB tastendruck
RETURN
PROCEDURE fusszeile ! Fußzeile für Listendruck
IF gadr%<>3 THEN
PRINT #2,SPC((zbreite%-LEN(text$(2)))/2);text$(2)
ELSE
PRINT #2,LEFT$(text$(2),le%)
ENDIF
trennzeile
IF vorschub%>0 THEN
FOR j%=1 TO vorschub%
PRINT #2
NEXT j%
ENDIF
RETURN
PROCEDURE index.ein
anweisung(21) ! Namen der Arbeitsdatei
anweisung(33) ! Ordner sind mit...
maske.einlesen
IF abbruch%=0 THEN ! nur ausführen wenn Dateiname eingegeben
CLR tx% ! Indexeinträge löschen
oeffne.i ! Dateigröße feststellen
indexwahl
mg1%=4000 ! maximale Einträge
IF pwd%=1 THEN ! Passwort vorhanden
mg%=mg1%
ELSE
mg%=300 ! kein Paßwort vorhanden
ENDIF
ERASE a$(),rc%(),z%()
DIM a$(mg1%+10),rc%(mg1%+10),z%(mg1%+10)! etwas Reserve
dimflag%=1
IF pwd%=0 AND n%>300 THEN
passwort ! Paßwort abfragen
ENDIF
ENDIF
RETURN
PROCEDURE indexwahl
id%(0)=1 ! dann Feld 1 als Index markieren
FOR j%=1 TO be%
te$(j%)=SPACE$(td%(j%)) ! Felder loeschen
NEXT j%
CLR sortflag% ! Datei als unsortiert kennzeichnen
indexflag%=1 ! Index vorhanden
index.pos ! Feldpositon feststellen
il%=td%(id%(0)) ! Anzahl der Zeichen für Indexdatei
RETURN
PROCEDURE index.pos ! Feldposition feststellen
po%(1)=1
FOR j%=1 TO be% ! Bildschirmpos. der Datenfelder berechnen
pt%(j%)=j%
po%(j%+1)=po%(j%)+td%(j%)
NEXT j%
RETURN
PROCEDURE kopfzeile ! Kopfzeilen für Listendruck
PRINT #2,text$(1);SPC(zbreite%-11-LEN(text$(1)));
PRINT #2,datum$;
PRINT #2,
sternzeile
RETURN
PROCEDURE lese.umenue(un%)
FOR jj%=1 TO un%
READ uy%(jj%),ux%(jj%),ux$(jj%)
NEXT jj%
RETURN
PROCEDURE maske.einblenden
LOCATE 1,sz%+1
FOR j2%=1 TO ez%
PRINT m$(j2%)
NEXT j2%
RETURN
PROCEDURE maske.einlesen ! Maske vom Datenträger lesen
programmname
IF abbruch%=0 THEN
OPEN "i",#1,pfad$(x2%)+maske$(x2%)
INPUT #1,ms%,be%,le%,dl%,dz%
FOR j%=1 TO ez%
LINE INPUT #1,m$(j%)
INPUT #1,mx%(j%),my%(j%)
NEXT j%
FOR j%=1 TO fz%
LINE INPUT #1,dr$(j%)
LINE INPUT #1,td$(j%)
LINE INPUT #1,tv$(j%)
INPUT #1,td%(j%)
NEXT j%
LINE INPUT #1,text$(1)
LINE INPUT #1,text$(2)
INPUT #1,druckzeilen%
INPUT #1,vorschub%
INPUT #1,dummy%
FOR j%=1 TO zmenue%
LINE INPUT #1,menue$(menue%+j%) ! zusätzliche Menüs
LINE INPUT #1,zpfad$(j%) ! Pfad zum Ausführen der Menüpunkte (Prg.)
NEXT j%
CLOSE
ENDIF
dl%=le%-1+be%-1 ! Druckbreite
RETURN
PROCEDURE maus.kontrolle
WHILE MOUSEK<>0 ! linken Mausknopf gedrueckt?
mausx%=MOUSEX ! Rechtswert Mauskoordinaten sichern
mausy%=MOUSEY ! Hochwert der Maus
FOR i4%=0 TO 7
IF mausx%>=x2(i4%) AND mausx%=<x3(i4%) THEN
IF mausy%>=y1(i4%) AND mausy%=<y2(i4%) THEN
v=(mausx%-x2(i4%))/(x3(i4%)-x2(i4%))
IF i4%=1 OR i4%=3 OR i4%=7 THEN
IF v>0.5 THEN
v=1
ELSE
CLR v
ENDIF
ENDIF
akt1%(i4%)=mi(i4%)+v*(ma(i4%)-mi(i4%))
zeichne.boxen ! Kontrollbox zeichnen
ENDIF
ENDIF
NEXT i4%
WEND
RETURN
PROCEDURE menÜausgeben ! Datenpflegemenü anzeigen
IF um%<1 OR um%>un% THEN ! Menüpunkt außerhalb des Bereiches
um%=1 ! ja, dann Menuepunkt = 1
ENDIF
COLOR 4 ! hellgrau
LINE 16,(28*8)-12,633-12,(28*8)-12 ! Linie
COLOR 2
LINE 16,(28*8)+2,633-12,(28*8)+2
FOR jj%=1 TO un% ! Menüs anzeigen
COLOR 4 ! hellgrau
LINE uy%(jj%)*8-12,ux%(jj%)*8-12,uy%(jj%)*8-12,ux%(jj%)*8+1
PCOLOR 6,0
PRINT AT(uy%(jj%),ux%(jj%));ux$(jj%)
PCOLOR 1,0
NEXT jj%
LOCATE uy%(um%),ux%(um%)
textstil(7,3,6) ! Menüpunkt invers darstellen
PRINT ux$(um%)
textstil(0,1,0) ! Invers aus
RETURN
PROCEDURE menÜkontrolle ! Hauptmenü
mn%=MENU(0) ! Menüpunkt
SELECT mn%
CASE 1
info
CASE 2
dialog
CASE 3
datenpflege
CASE 4
beenden
CASE 7
sprache%=NOT sprache% ! Flag invertieren
IF sprache% THEN
MENU 7,&H153 ! Haken entfernen
ELSE
MENU 7,&H53 ! Menüpunkt abhaken
ENDIF
CASE 8
spracheinstellung
CASE 9
lern%=NOT lern% ! Flag invertieren
IF lern% THEN
MENU 9,&H153 ! Haken entfernen
ELSE
MENU 9,&H53 ! Menüpunkt abhaken
ENDIF
CASE 10
dial%=NOT dial% ! Flag invertieren
IF dial% THEN
MENU 10,&H153 ! Haken entfernen
ELSE
MENU 10,&H53 ! Menüpunkt abhaken
ENDIF
CASE 13 ! Worschatz drucken
IF tx%>0 THEN
gadr%=4
verzeichnis.aus
ELSE
daten.bereitst
ENDIF
CASE 14 ! Wortschatz in Datei
IF tx%>0 THEN
gadr%=1
verzeichnis.aus
ELSE
daten.bereitst
ENDIF
ENDSELECT
programmkopf
anweisung(27)
RETURN
PROCEDURE menÜkontrolle1 ! Datenpflegemenü
anweisung(aw%)
WHILE mausk%<>2 AND x%<>13
menÜausgeben
taste
IF mausy%=28 THEN
menÜnummer
ELSE IF x%<>13
x%=ASC(MID$(x$,2,1))-37
IF x%=30 ! Cursor rechts
INC um%
ELSE IF x%=31 ! Cursor links
DEC um%
ENDIF
IF um%<1 THEN
um%=un%
ELSE IF um%>un%
um%=1
ENDIF
ENDIF
FOR j1%=1 TO un%
IF LEFT$(x$,1)=MID$(ux$(j1%),1,1) THEN
um%=j1%
ENDIF
NEXT j1%
WEND
CLR x%
RETURN
PROCEDURE menÜnummer ! Menünummer des angekl. Menüpkt. berechn.
FOR jj%=1 TO un%
IF mausx%>=uy%(jj%) AND mausx%<=uy%(jj%)+LEN(ux$(jj%)) THEN ! Spalte
um%=jj%
ENDIF
NEXT jj%
RETURN
PROCEDURE oeffne.a ! Datei zum Anfügen öffnen
OPEN "a",#2,pfad$(x2%)+d$(x2%)
RETURN
PROCEDURE oeffne.i ! Dateigröße feststellen
OPEN "I",#1,pfad$(x2%)+d$(x2%)
lo%=LOF(#1) ! Dateigröße
n%=lo%/le% ! Anzahl der gespeicherten Datensätze
CLOSE #1 ! Datei schließen
RETURN
PROCEDURE oeffne.r ! Relative Datei öffnen
OPEN "R",#1,pfad$(x2%)+d$(x2%),le%
FIELD #1,(le%) AS record$
RETURN
PROCEDURE passwort ! Paßwortabfrage
pwd%=1
RETURN
PROCEDURE position ! Ausgabespalten berechnen
sl%=1
feldp%(lgr%)=1
FOR j1%=1 TO rgr%-lgr%+1
feldp%(j1%+1)=sl%+td%(lgr%+j1%-1)
sl%=sl%+td%(lgr%+j1%-1)
NEXT j1%
RETURN
PROCEDURE programmkopf
CLS
COLOR 2 ! schwarze Box
PBOX 1,1,639,20
COLOR 0 ! grau
PBOX 6,4,633,17
COLOR 4 ! hellgrau
LINE 6,4,633,4
LINE 6,4,6,17
PRINT AT(2,2);SPACE$(78)
PCOLOR 6,0
PRINT AT(2,2);"Prg.:";dateiname$
PRINT AT(21,2);"Frei:";FRE(0)
PRINT AT(34,2);"Größe:";lo%
PRINT AT(47,2);"Extern: ";n%
PRINT AT(65,2);"Intern: ";tx%
PCOLOR 1,0
programmfuss
RETURN
PROCEDURE programmauswahl(titel$,oktext$,VAR pfad$,dateiname$)
FILESELECT titel$,oktext$,pfad$,dateiname$
pos1%=RINSTR(dateiname$,"/")
pos2%=RINSTR(dateiname$,":")
IF pos1%>0 THEN ! Dateipfad herausfiltern
pfad$=MID$(dateiname$,1,pos1%)
dateiname$=MID$(dateiname$,pos1%+1)
ELSE IF pos2%>1 AND pos1%=0 ! Laufwerk nach Drive$()
pfad$=LEFT$(dateiname$,pos2%)
dateiname$=MID$(dateiname$,pos2%+1)
ENDIF
RETURN
PROCEDURE programmname
pfad$=pfad$(x2%) ! Pfad übergeben für Fileselect
IF pfad$="" THEN
pfad$=DIR$(0) ! aktuelles Laufwerk übernehmen
ENDIF
programmauswahl("Datei auswählen","OK",pfad$,dateiname$)
IF dateiname$="" THEN
abbruch%=1 ! Abbruchflag setzen
ELSE
CLR abbruch% ! Abbruchflag löschen
IF RIGHT$(dateiname$,6)=".Daten" OR RIGHT$(dateiname$,6)=".Maske" THEN
dateiname$=LEFT$(dateiname$,LEN(dateiname$)-6)
ENDIF
d$(x2%)=dateiname$+".Daten" ! Datenbankname
maske$(x2%)=dateiname$+".Maske"! Name der Konfigurationsdatei
ENDIF
pfad$(x2%)=pfad$ ! Pfad sichern für nächstes Fileselect
RETURN
PROCEDURE programmfuss ! Anweisungsboxen zeichnen
COLOR 2 ! schwarz
PBOX 1,(27*8)-10,639,(32*8) ! schwarze Box
COLOR 0 ! grau
PBOX 6,(27*8)-7,633,(28*8)+4 ! graue Box
PBOX 6,(29*8)+2,633,(32*8)-4 ! 2. graue Box
COLOR 4 ! hellgrau
BOX 7,(27*8)-7,633,(32*8)-3
LINE 7,(29*8)+2,633,(29*8)+2
LINE 16,(29*8)-6,639-16,(29*8)-6
LINE 16,(29*8)+5,639-16,(29*8)+5
LINE 639-16,(29*8)-6,639-16,(26*8)+4 ! senkrechter Strich
LINE 16,(29*8)+5,16,(31*8)+2 ! senkrechter Strich
COLOR 2 ! schwarz
LINE 7,(32*8)-3,633,(32*8)-3 ! schwarze Linie
LINE 633,(27*8)-7,633,(32*8)-3
LINE 16,(27*8)-4,639-16,(27*8)-4
LINE 16,(31*8)+2,639-16,(31*8)+2
LINE 16,(29*8)-6,16,(26*8)+4 ! senkrechter Strich
LINE 639-16,(29*8)+5,639-16,(31*8)+2 ! senkrechter Strich
RETURN
PROCEDURE prÜfe.vorgabe ! Vorgabemaske vergleichen
vflag%=1 ! OK-Flag setzen
RETURN
PROCEDURE prÜfe.vorgabe.input(j2%,t$)
IF vg%(j2%)=3 THEN ! Eingabe rechtsbündig
tx$=RIGHT$(SPACE$(td%(j2%))+TRIM$(t$),td%(j2%))
ENDIF
RETURN
PROCEDURE satz.lesen ! einen Datensatz lesen
rn%=rc%(i%) ! Recordnummer
GET #1,rn%
FOR j1%=1 TO be%
te$(j1%)=MID$(record$,po%(j1%),td%(j1%))
NEXT j1%
RETURN
PROCEDURE satz.schreiben ! Datensatz in Datenbank speichern
IF a$(i%)<>te$(id%(0)) THEN ! wurde der Indexeintrag verändert?
a$(i%)=te$(id%(0)) ! ja, dann Eintrag übernehmen
CLR sortflag% ! Datei ist nicht mehr sortiert
ENDIF
rc$="" ! Datensatz löschen
FOR j1%=1 TO be%
rc$=rc$+te$(j1%) ! Datensatz zusammensetzen
NEXT j1%
LSET record$=rc$ ! Datensatz übergeben
PUT #1,rn% ! und speichern
RETURN
PROCEDURE sortieren ! Index sortieren
WHILE sortflag%=0 AND indexflag%=1
anweisung(24)
QSORT a$(),tx%+1,rc%()
sortflag%=1
PRINT AT(4,ax%(aw%));SPACE$(74)
WEND
RETURN
PROCEDURE sp.mangel ! Speichermangel anzeigen
PRINT AT(4,31);SPACE$(74);
PCOLOR 6,0
PRINT AT(4,31);"Wegen Speichermangel nicht möglich.";
PCOLOR 1,0
PRINT "Weiter mit RETURN";
taste
PRINT AT(4,31);SPACE$(74);
CLR x% ! Zeichen löschen, wir sind im INPUT
RETURN
PROCEDURE spracheinstellung
programmkopf
anweisung(6)
zeichne.regler ! Regler zeichnen
mausx%=600 ! Rechtswert der als Schleifeneingangswert
WHILE mausx%>400 !
maus.kontrolle ! zur Mauskontrolle
WEND
RETURN
PROCEDURE sternzeile
PRINT #2,STRING$(zbreite%,"*")
RETURN
PROCEDURE suchen ! Datensatz suchen
i1%=1
i2%=tx%+1 ! Anzahl +1 um den letzten Eintrag zu vergleichen
in%=-1 ! Flag
WHILE in%=-1
i3%=INT((i1%+i2%)/2) ! Liste halbieren
IF su$=LEFT$(a$(i3%),ls%) THEN
in%=i3% ! gefunden
ENDIF
IF su$<LEFT$(a$(i3%),ls%) THEN
i2%=i3%
ELSE
i1%=i3%
ENDIF
IF i3%=INT((i1%+i2%)/2) AND in%=-1 THEN
CLR in% ! nicht gefunden
ENDIF
WEND
RETURN
PROCEDURE suchen1 ! Datensatz suchen
i1%=1
i2%=tx%+1 ! Anzahl +1 um den letzten Eintrag zu vergleichen
in%=-1 ! Flag
WHILE in%=-1
i3%=INT((i1%+i2%)/2) ! Liste halbieren
IF su$=UPPER$(TRIM$(a$(i3%))) THEN
in%=i3% ! gefunden
ENDIF
IF su$<UPPER$(TRIM$(a$(i3%))) THEN
i2%=i3%
ELSE
i1%=i3%
ENDIF
IF i3%=INT((i1%+i2%)/2) AND in%=-1 THEN
CLR in% ! nicht gefunden
ENDIF
WEND
RETURN
PROCEDURE tagesdatum
programmkopf
PRINT AT(20,10);"Tagesdatum: "
eingabe(1,10,33,10,DATE$)
datum$=tx$
RETURN
PROCEDURE taste ! ein Zeichen von der Tastatur holen
CLR x% ! Steuerzeichen löschen
CLR mausk%
CLR mausx% ! Mausspalte löschen
CLR mausy% ! Mauszeile löschen
WHILE x%=0 AND MOUSEK=0
x$=INKEY$ ! Zeichen von Tastatur
x%=ASC(x$) ! ASCII-Wert für Auswertung
WEND
IF MOUSEK<>0 THEN ! linke Maustaste
mausx%=INT(MOUSEX/8)+1 ! ja, dann Spalte = mausx
mausy%=INT(MOUSEY/8)+1 ! Zeile = mausy
mausk%=MOUSEK ! Maustaste
ENDIF
RETURN
PROCEDURE tastendruck
PRINT AT(4,28);SPACE$(74);
PCOLOR 6,0
PRINT AT(18,28);" Weiter mit beliebiger Taste oder Mausklick."
GOSUB taste
PCOLOR 1,0
PRINT AT(4,28);SPACE$(74)
RETURN
PROCEDURE textkomposition !
CLR x%
CLR x1%
FOR j%=1 TO w%
IF UPPER$(e1$(j%))="UND" OR UPPER$(e1$(j%))="ODER" THEN
INC x%
ELSE IF UPPER$(e1$(1))="DU" OR UPPER$(e1$(1))="IHR"
x1%=1
ENDIF
NEXT j%
IF x1%=1 AND NOT x% THEN
INC kz1% ! Zähler der kompositionstexte erhöhen
IF kz1%>kz% THEN ! schon alle Texte benutzt?
kz1%=1 ! ja, dann wieder von vorn anfangen
ENDIF
t$=komp$(kz1%)+" "+e1$(x1%) !
FOR j%=x1%+2 TO w%
t$=t$+" "+e1$(j%)
NEXT j%
t$=t$+" "+e1$(x1%+1)+"."
ok%=1 ! Flag, Textkomposition erfolgreich
ENDIF
RETURN
PROCEDURE textstil(stil%,vfarbe%,hfarbe%)
par$=STR$(stil%)+";"+STR$(30+vfarbe%)+";"+STR$(40+hfarbe%)
PRINT CHR$(&H9B);par$;CHR$(&H6D);
RETURN
PROCEDURE trennzeile
PRINT #2,STRING$(zbreite%,"-")
CLR zzaehler%
RETURN
PROCEDURE unterbrechung
CLR abbruch% ! Abbruchflag loeschen
x$=INKEY$
IF x$<>"" THEN
IF x$<>CHR$(27) THEN ! ESC gedrueckt
x$="" ! nein, dann warten
WHILE x$="" ! warte auf Tastendruck
x$=INKEY$
WEND
ELSE
abbruch%=1 ! Abbruchflag setzen
ENDIF
ENDIF
RETURN
PROCEDURE vergleich
vflag%=1 ! OK-Flag setzen
RETURN
PROCEDURE verlegenheitsfrage ! Verlegenheitsfrage stellen
su$="VERLEGENHEIT" ! Suchwort
suchen1 ! Wort suchen
IF in% THEN ! Wort gefunden
WHILE UPPER$(TRIM$(a$(in%-1)))=su$ ! Bereichsanfang rückwarts suchen
DEC in% ! Zähler -1
WEND
CLR ig% !
WHILE UPPER$(TRIM$(a$(in%)))=su$ ! vorwärts suchen
INC ig%
in%(ig%,0)=ii% ! Wortnummer merken
in%(ig%,1)=in% ! Recordnummer merken
INC in%
WEND
ENDIF
RETURN
PROCEDURE verzeichnis.aus ! Listenausgabe
oeffne.r ! Datenbank öffnen
CLR zzaehler% ! Zeilenzähler löschen
CLR za%
CLR abbruch%
sortieren ! Indexdatei sortieren
tagesdatum ! Datum abfragen
programmkopf
von%=1
bis%=tx%
IF gadr%=1 THEN ! Liste in Datei schreiben
x2%=3
anweisung(22)
programmname ! Programmnamen abfragen/Abbruch
IF abbruch%=1 THEN ! Abbruch gewählt?
GOTO verzeichnis.aus.ende ! ja, dann PROCEDURE abbrechen
ENDIF
programmkopf
OPEN "o",#2,pfad$(x2%)+dateiname$ ! Datei öffnen
zbreite%=dz%*(dl%)+dz% ! Anzahl der Zeichen je Druckzeile
mz%=dz% ! ein- oder zweispaltiger Druck
PRINT AT(3,28);"Datenausgabe in Datei. Schreibe Datensatz Nummer:"
PRINT AT(63,28);"bis: ";bis%
anweisung(16)
ELSE IF gadr%=4 ! Liste auf Drucker
aw%=8
abfrage.nein
IF y$="J" THEN ! Drucker ist richtig eingestellt
zbreite%=dz%*(dl%)+dz% ! Anzahl der Zeichen je Druckzeile
OPEN "o",#2,"PRT:" ! Drucker ist Ausgabegerät
PRINT AT(4,28);"Datenausgabe auf Drucker. Schreibe Datensatz Nr:"
PRINT AT(63,28);"bis: ";bis%
anweisung(16)
ELSE ! Drucker ist noch nicht eingestellt
abbruch%=1 ! Abbruchflag setzen
ENDIF
ENDIF
i%=von%-1
WHILE i%<bis% AND abbruch%=0
INC i%
unterbrechung
satz.lesen ! Datensatz lesen
IF zzaehler%>=druckzeilen% THEN
trennzeile
fusszeile
ENDIF
IF zzaehler%=0 AND za%=0
sternzeile
kopfzeile
druckfeldname
PRINT #2
trennzeile
ENDIF
IF gadr%<>3 THEN ! Ausgabe in Datei?
PRINT AT(53,28);i% ! ja, dann anzeigen daß ich arbeite
ENDIF
FOR j%=1 TO be%
IF pt%(j%)>0 THEN ! Datenfeld ausgeben, 0 = nicht ausgeben
PRINT #2,te$(pt%(j%));SPC(1); ! Datenfeld ausgeben
ENDIF
NEXT j%
IF mz%>1 THEN ! zwei Datensätze je Zeile?
INC za% ! ja, Zähler erhöhen
IF za%<mz% THEN ! schon 2 Datensätze ausgegeben?
GOTO verz3 ! ja, dann weiter
ENDIF
IF sl%=zbreite% THEN
GOTO verz2
ENDIF
ENDIF
PRINT #2
verz2:
INC zzaehler% ! Zeilenzähler +1
CLR za% ! Doppelspaltenzähler zurücksetzen
verz3:
WEND
IF gadr%<>3 AND abbruch%=0 THEN ! Zeilenvorschub letzte Seite
FOR zzaehler%=zzaehler%+1 TO druckzeilen%
PRINT #2,
NEXT zzaehler%
trennzeile
fusszeile
ENDIF
verzeichnis.aus.ende:
CLOSE
CLR x2%
RETURN
PROCEDURE zeile.zerlegen ! Eingabe des Gesprächpartners zerlegen
x$=RIGHT$(e$,1) ! Satzzeichen merken
CLR frage% ! Frageflag löschen
IF x$="?" THEN ! Frage?
frage%=1 ! ja, dann Flag für Fragezeile setzen
e$=LEFT$(e$,LEN(e$)-1) ! Satzzeichen entfernen
ELSE IF x$="!" OR x$="."
e$=LEFT$(e$,LEN(e$)-1) ! Satzzeichen entfernen
ENDIF
e%=LEN(e$) ! Länge der Eingabe für Auswertungen
PRINT AT(3,28);SPACE$(76)
IF e%>3 THEN ! ab 3 Zeichen Auswerten
PRINT AT(30,28);"Laß mich überlegen."
CLR w%
CLR j%
WHILE j%<e% ! Position < der Eingabezeile?
INC w% ! Wortzähler plus 1
e$(w%)="" ! Wort löschen
x$="" ! Zeichen löschen
WHILE j%<e% AND x$<>" "
INC j% ! Position in der Eingabe plus 1
x$=MID$(e$,j%,1) ! ein Zeichen merken
IF x$<>" " THEN ! <> Space
e$(w%)=e$(w%)+x$ ! ja, dann Zeichen übernehmen
ENDIF
WEND
WEND
ENDIF
erste.person.ersetzen ! 1. Person durch 2. Person ersetzen
RETURN
PROCEDURE zeichne.regler
zeile=5 ! Position der Eingabezeile
FOR i4%=0 TO 7
LOCATE 1,2*i4%+zeile+2
PRINT " ";feld1$(i4%); ! Bezeichnung des Schiebereglers
WHILE CRSCOL<50
PRINT "."; ! Punktreihe bis zum Schieberegler
WEND
x2(i4%)=(CRSCOL*8)+10 ! Grafik-Cursorpositionen uebergeben
y1(i4%)=(CRSLIN*8)-8
x3(i4%)=(CRSCOL*8)+200
y2(i4%)=(CRSLIN*8)
GOSUB zeichne.boxen ! Kontrollboxen zeichnen
NEXT i4%
RETURN
PROCEDURE zeichne.boxen ! Kontrollbox zeichnen
COLOR 1
PBOX x2(i4%)-2,y1(i4%)-1,x3(i4%)+2,y2(i4%)+1
COLOR 3 ! Kontrollbox zeichnen
PBOX x2(i4%),y1(i4%),x3(i4%),y2(i4%)
x=(akt1%(i4%)-mi(i4%))/(ma(i4%)-mi(i4%))
x=x2(i4%)+x*(x3(i4%)-x2(i4%))
COLOR 2 ! Schieberegler zeichnen
PBOX x+1,y1(i4%),x,y2(i4%)
RETURN
PROCEDURE init ! Programm initialisieren
ON ERROR GOSUB fehler
MODE 0
dial%=-1 ! Dialogausgabe einschalten
sprache%=-1 ! Sprachausgabe eingeschaltet
bl%=146 ! Voreinstellung für Druckbreite
zl%=80 ! Anzahl der Spalten für Bildschirmausgabe
CLR x2%
un%=10 ! Anzahl der Datenpflegemenüs
sel%=5 ! Anzahl der Selektierfunktionen
at%=35 ! Anzahl der Anweisungen
sz%=4 ! Startzeile der Bildschirmausgabe
ez%=21 ! Zeilenanzahl der Bildschirmmaske
fz%=21 ! Anz. Datenfelder
breite%=640 ! Screenbreite
hoehe%=256 ! Screenhöhe
ebenen%=3 ! 2 Bitplanes
OPENS 1,0,0,breite%,hoehe%,ebenen%,&H8000
OPENW #1,0,0,breite%,hoehe%,&H18,&H1800,1
farben.setzen ! Farbpalette setzen
init.variable ! Variable initialisieren
lese.umenue(un%)
FOR j%=0 TO at%
READ ax%(j%),ay%(j%),aw$(j%),dummy%
NEXT j%
CLR kz%
RESTORE komptexte
WHILE komp$(kz%)<>"ende"
INC kz%
READ komp$(kz%)
WEND
DEC kz%
RETURN
PROCEDURE init.variable
DIM feld1$(8),mi(8),ma(8),akt1%(8)! für die Sprachausgabe
DIM x2(8),x3(8),y1(8),y2(8)
DIM in%(200,1) ! Recordnummer für gefundene Schlüsselworte
DIM m$(ez%) ! Bildschirmmaske
DIM td1$(ez%),id%(ez%) !
DIM mx%(ez%),my%(ez%) ! Zeilen und Spalten der Datenfelder (Maske)
DIM ax%(at%),ay%(at%),aw$(at%)! Anweisungstexte und Position
DIM pfad$(3),d$(3) ! Pfadnamen und Dateinamen
DIM maske$(3)
DIM text$(2) ! Listenbeschriftung
DIM tv$(fz%) ! Vergleichsmasken
DIM pt%(fz%),po%(fz%),feldp%(fz%)! Reihenfolge und Position der Datenfelder
DIM su$(fz%),su%(fz%) ! Suchstring und Flag
DIM te$(fz%),td$(fz%),td%(fz%)! Feldinhalt, Datenfeldname und Datenfeldlänge
DIM dr$(fz%) ! Datenfeldnamen
DIM x1%(fz%),x4%(fz%),vg%(fz%),sa%(fz%),ersatz$(fz%) ! Selektieren
DIM menue$(16) ! Anzahl der Menüs
DIM ux%(un%),uy%(un%),ux$(un%)! Eingabe-Menüs
DIM e$(30),e1$(30) ! Anzahl der Worte eines Satzes
DIM komp$(30) ! Anzahl der Kompositonstexte
RETURN
PROCEDURE menueein ! Menüs einschalten
menue$(0)=" Eliza "
menue$(1)=" Info "
menue$(2)=" Dialog mit Eliza "
menue$(3)=" Dialogdatei pflegen "
menue$(4)="+Q Programm beenden "
menue$(5)=""
menue$(6)=" Voreinstellungen "
menue$(7)=" Sprache an/aus "
menue$(8)=" Spracheinstellung "
menue$(9)=" Lernmodus an/aus "
menue$(10)=" Dialogaufzeichnung "
menue$(11)=""
menue$(12)=" Datenausgabe "
menue$(13)=" Wortschatz auf Drucker "
menue$(14)=" Wortschatz in Datei "
menue$(15)=""
menue$(16)=""
MENU menue$()
MENU 7,&H153 ! Menüpunkt abhaken
MENU 9,&HC0 ! Menüpunkt abhaken
MENU 10,&H153 ! Menüpunkt abhaken
RETURN
PROCEDURE daten ! Daten für Menüs und Anweisungen
um1:
DATA 4,28," "
DATA 12,28,"suchen"
DATA 19,28,"ändern"
DATA 26,28,"löschen"
DATA 34,28,"1.Satz"
DATA 41,28,"zurück"
DATA 48,28,"vorwärts"
DATA 57,28,"tab Ende"
DATA 66,28," "
DATA 74,28,"Ende"
'
DATA 31, 5,"Variable Anweisung",0
DATA 28,12,"Soll eine bestehende Maske verwendet werden",1
DATA 28,30,"Sind Sie sicher",2
DATA 28,22,"Sind alle Angaben richtig",3
DATA 31, 6,"Suchbegriffe eingeben und mit RETURN bestätigen. Weiter mit RETURN.",4
DATA 31,24,"Steuerung mit den Cursor-Tasten",5
DATA 31, 6,"Beenden der Einstellung durch Mausklick in die linke Bildschirmhälfte.",6
DATA 31,10,"Dialog mit Eliza kann durch die Eingabe von 'quit' beendet werden.",7
DATA 28, 4,"Ist die Druckbreite von mehr als 89 Zeichen eingestellt",8
DATA 31,10,"",9
DATA 31, 4,"",10
DATA 31,14,"",11
DATA 31,18,"",12
DATA 28,20,"",13
DATA 31, 4,"Dateneingabe oder Datenänderung können Sie nur mit der 'Esc'-Taste beenden.",14
DATA 31, 4,"",15
DATA 31, 8,"Unterbrechung mit beliebiger Taste, Abbruch mit der « Esc-Taste » ",16
DATA 31, 4,"",17
DATA 31, 4,"Anwahl = linke Maustaste, Cursor, Buchst. Start = rechte Maustaste, RETURN",18
DATA 28,10,"",19
DATA 31, 4,"Bitte zutreffendes anwählen:",20
DATA 28, 4,"Bitte Namen der Wortschatz-Datei auswählen. Endung '.Daten'.",21
DATA 28, 4,"",22
DATA 28,13,"",23
DATA 31,30,"Sortierung läuft!",24
DATA 28,10,"",25
DATA 28, 4,"",26
DATA 31, 5,"Bitte wählen Sie einen Menüpunkt. Eliza V1.20 (c) 10.9.1991 by KG-Soft",27
DATA 31,10,"Der interne Speicher ist voll. Weiter mit beliebiger Taste",28
DATA 28, 4,"",29
DATA 31, 4,"",30
DATA 28,14,"",31
DATA 22,20,"Übernommenen Datensatz ergänzen",32
DATA 31, 4,"Ordner sind mit '*' gekennzeichet. Zum Ordnerwechsel nur einmal klicken.",33
DATA 28, 4,"Auswertung in neue Datei (J), an vorhandene Datei anhängen (N)",34
DATA 28, 4,"",35
um2:
DATA 50,28," = "
DATA 55,28," <> "
DATA 60,28," < "
DATA 65,28," > "
DATA 70,28," * "
voreinstellung:
' Minimalwert, Maximalwert, Voreinstellung
DATA "Ton-Höhe",65,320,110
DATA "Silbenbetonung an/aus",0,1,0
DATA "Sprechgeschwindigkeit",40,400,150
DATA "männlich/weiblich",0,1,0
DATA "Stimmlage tief/hoch",5000,28000,22200
DATA "Lautstärkeregler",0,63,63
DATA "Balance-Regler links/rechts",0,10,5
DATA "Synchrone Sprachausgabe an/aus",0,1,0
phoneme:
DATA A,8,AEU,OY,AEH,AEAE,AY,AY,AI,AY,AH,AAAA,AU,AW,AE,AE,A,AA
DATA B,1,B,B
DATA C,8,CAE,TSAE," CH"," K",CHS,KS,CH,/C,CK,K,CE,TSEH,CI,TSIH,C,K
DATA D,1,D,D
DATA E,9,"EN ","IN ","EL ","IL ","ES ","IXS ",EI,AY,EY,AY,EH,EH,EU,OY,EN,EHN,E,EH
DATA F,1,F,F
DATA G,1,G,G
DATA H,1,H,/H
DATA I,3,IE,IY,IH,IY,I,IX
DATA J,2," J"," IHY",J,Y
DATA K,1,K,K
DATA L,1,L,L
DATA M,1,M,M
DATA N,1,N,N
DATA O,7,OEH,ER,OE,ER,OU,UH,OI,OY,OH,OH,O,OH,OY,OY
DATA P,2,PH,F,P,P
DATA Q,1,Q,KV
DATA R,3," R","R","R ","RX","R","R"
DATA S,22,SCH,SH,"ST ","ST ",SB,SB,SD,SD,SF,SF,SG,SG,SH,S/H,SR,SR,SS,S
DATA SJ,SY,SK,SK,SL,SL,SM,SM,SN,SN,SP,SHP,SQ,SKV,SZ,STS,S,Z,SV,SF
DATA ST,SHT,SW,SV,SX,SKS
DATA T,6," TIO",TSIYAA,TIA,TSIYAA,TZ,TS,TH,TT,TT,TT,T,DT
DATA U,5, UEH,ER, UE,ER, UH,UW,"U ","UW ",U,UH
DATA V,1,V,F
DATA W,1,W,V
DATA X,1,X,KS
DATA Y,2," YH","IH","Y","IH"
DATA Z,2," Z",TS,"Z","TS"
REM Ersatz fuer Space
DATA "@",1,"@"," "
REM Ersatz fuer _
DATA "_",1,"_",QX
REM Ersatz fuer ä
DATA "[",3,"[U",OY,"[H",EH,"[",AE
REM Ersatz fuer ö
DATA "\",2,"\H",ER,"\",ER
REM Ersatz fuer
DATA "]",2,"]H",ER,"]",ER
DATA "^",1,"^",S
DATA ende,0
RETURN
PROCEDURE daten1
beugungen:
DATA "bin","bist"
' DATA "dachte","dachtest"
DATA "denke","denkst"
DATA "fahre","fährst"
' DATA "finde","findest"
DATA "finden","findest"
DATA "geht",ging""
DATA "ging","gingst"
DATA "habe","hast"
DATA "haben","habt"
DATA "halte","hältst"
' DATA "hatte","hattest"
DATA "heißt","heiße"
DATA "heisst","heiße"
DATA "intressiere","intressierst"
' DATA "kann","kannst"
DATA "liebe","liebst"
DATA "mache","machst"
' DATA "mag","magst"
DATA "meiner","Deiner"
' DATA "möchte","möchtest"
DATA "soll","sollte"
DATA "war","warst"
DATA "waren","ward"
DATA "weiß","weist"
DATA "werde","wirst"
DATA "wollen","wollt"
' DATA "wollte","wolltest"
' DATA "würde","würdest"
DATA "ende","ende"
komptexte:
DATA "Es ist doch schön, daß"
DATA "Das finde ich richtig, daß"
DATA "Das interessiert mich nicht, daß"
DATA "Es ist nicht wichtig, daß"
DATA "Wen interessiert das schon, daß"
DATA "Ist das so wichtig, daß"
DATA "Erzähle das Deinem Frisör, daß"
DATA "ende","ende"
RETURN
PROCEDURE farben.setzen
SETCOLOR 0,5,5,5 ! grau statt blau
SETCOLOR 1,15,15,15 ! weiß bleibt
SETCOLOR 2,0,0,0 ! schwarz erhalten
SETCOLOR 3,15,5,0 ! rot bleibt
SETCOLOR 4,10,10,10 ! hellgrau
SETCOLOR 5,0,0,15 ! blau
SETCOLOR 6,15,15,0 ! gelb
SETCOLOR 7,0,0,0 ! schwarz erhalten
RETURN
PROCEDURE info
programmkopf
PCOLOR 6,0
PRINT AT(1,5);"Eliza V1.20";
PCOLOR 1,0
PRINT " ist ein Programm, daß eine künstliche Intelligenz simuliert."
PRINT AT(1,7);"Die deutsche Sprachausgabe ist noch nicht perfekt, dafür aber abschaltbar."
PRINT AT(1,9);"Der Lernmodus ist in der PD-Version nicht vorhanden."
PRINT AT(1,11);""
PCOLOR 3,0
PRINT AT(10,23);"(c) 1991 by Henry König, Bornheide 71, 2000 Hamburg 53"
PCOLOR 1,0
PRINT AT(5,25);"Dieses Programm darf kopiert und in jede PD-Serie übernommen werden."
tastendruck
RETURN
PROCEDURE init.deutsch ! deutschen Text wandeln
abz%=64 ! ASCII-Wert des 1. gueltigen Zeichens
n1%=0
n2%=0
RESTORE phoneme
x$="" ! Eingangswert für die Schleife
WHILE x$<>"ende"
READ x$,n4% ! Anzahl der Ersatz-Phoneme je Zeile
IF n4%>0 THEN
a4%=ASC(x$) ! ASCII-Wert
IF a4%>n1% THEN ! gelesener Wert > letztem Wert?
n1%=a4% ! ja, dann fuer DIM merken
ENDIF
IF n4%>n2% THEN
n2%=n4%
ENDIF
FOR i4%=1 TO n4% ! Anzahl der Phoneme je Zeile
READ x$,x$ ! ueberlesen
NEXT i4%
ENDIF
WEND
n1%=n1%-abz%
DIM te1$(n1%,n2%),ph$(n1%,n2%),n5%(n1%) ! Array fuer Phoneme
RESTORE phoneme
x$=""
WHILE x$<>"ende"
READ x$,n4%
IF n4%>0 THEN
x%=ASC(x$)
n5%(x%-abz%)=n4%
FOR i4%=1 TO n4% ! Anzahl der Phoneme
READ te1$(x%-abz%,i4%) ! Buchstabe oder Buchstabenfolge lesen
READ ph$(x%-abz%,i4%) ! Phoneme für Buchstabe oder Buchstabenfolge
NEXT i4%
ENDIF
WEND
RETURN
PROCEDURE init.sprache
RESTORE voreinstellung
FOR i4%=0 TO 7
READ feld1$(i4%),mi(i4%),ma(i4%),akt1%(i4%)
NEXT i4%
RETURN
REM